#include "process.h"

/*------------------------宏定义------------------------*/
//1.定义进度条填充的字符样式
#define STYLE '=' //注意：STYLE是字符，所以=需要加上单引号
//2.定义缓冲区大小
#define NUM 101  ///注意：+1 是为了容纳字符串结束符 '\0'

/*------------------------version1版本的进度条------------------------*/
//功能：简单的固定次数进度条实现函数
void process_v1()
{
    /*----------------准备阶段----------------*/
    //1.用于存储进度条字符的数组
    char buffer[NUM];
    //2.将数组中的所有字节初始化为 0
    memset(buffer, 0, sizeof(buffer));


    //3.定义进度条旋转的指示字符数组，模拟进度条的动态效果
    const char* lable = "|/-\\"; //细节：由于单独一个'\'是转移字符，所以想要'反斜杠\'需要加两个\
    //4.获取指示字符数组的长度
    int len = strlen(lable);


    /*----------------打印阶段----------------*/
    int cnt = 0;
    while (cnt <= 100)
    {
        //第一步：打印进度条
        printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt % len]);

        /*  细节分析：
        *		%-100s：表示左对齐，占 100 个字符宽度的字符串（进度条主体）---> 值得细细品味
        *		[%d%%]：表示当前进度的百分比数值
        *		[%c]：  表示当前旋转的指示字符
        *		\r：    是回车符，将光标移到当前行开头，实现覆盖输出，让进度条在同一行更新
        */

        //第二步：刷新标准输出缓冲区
        fflush(stdout);

        //多加一步：向缓冲区中添加一个进度条样式字符
        buffer[cnt] = STYLE;

        //第三步：让程序休眠：50000 微秒（0.05 秒）
        usleep(50000);

        //第四步：更新循环因子
        cnt++;
    }
    
    printf("\n"); //小细节：进度条完成后，输出一个换行符，使光标移到下一行
}



/*------------------------version2版本的进度条------------------------*/
void process_v2(double total, double current)
{
    /*----------------准备阶段----------------*/
    //1.用于存储进度条字符的数组
    char buffer[NUM];
    //2.将数组中的所有字节初始化为 0
    memset(buffer, 0, sizeof(buffer));


    //3.定义进度条旋转的指示字符数组，模拟进度条的动态效果
    const char* lable = "|/-\\"; //细节：由于单独一个'\'是转移字符，所以想要'反斜杠\'需要加两个\
    //4.获取指示字符数组的长度
    int len = strlen(lable);


    /*----------------准备阶段----------------*/
    //1.定义静态变量 ---> 用于记录旋转指示字符的位置，程序运行过程中保持值不变（跨函数调用）
    static int cnt = 0;

    //2.旋转指示字符的位置取模，实现循环旋转效果
    cnt = cnt % len;

    //3.计算当前进度的百分比 ---> 乘以 100 后取整
    int num = (int)(current * 100 / total);

    //4.根据进度百分比向缓冲区填充进度条样式字符
    for (int i = 0; i < num; i++)
    {
        buffer[i] = STYLE;
    }

    //5.计算进度的比例（0 到 1 之间的小数）
    double rate = current / total;


    /*----------------打印阶段----------------*/
    //第一步：打印进度条
    printf("[%-100s][%.1f%%][%c]\r", buffer, rate * 100, lable[cnt]);
    /*  细节分析：
    *		%-100s：进度条主体
    *		[%.1f%%]：进度百分比，保留 1 位小数
    *		[%c]：旋转的指示字符
    *		\r：回车符，实现覆盖输出
    */

    //第二步：刷新标准输出缓冲区
    fflush(stdout);

    //第三步：更新循环因子 ---> 旋转指示字符的位置加 1，为下次旋转做准备
    cnt++;
}